/**
 * 第三方API调用工具
 * 使用access_token访问第三方服务
 */

import tokenUtil from './tokenUtil.js';

// 第三方API基础URL - 使用完整URL
const THIRD_PARTY_BASE_URL = 'http://47.110.53.42:9999';

// 临时解决方案：硬编码token
// 注意：这只是临时解决方案，实际生产环境应该通过正规的验证流程获取token
const TEMP_ACCESS_TOKEN = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE3NDM4NDU0NDMsImV4cCI6MTc0NDQ1MDI0MywiaXNzIjoiaHR0cDovLzEyNy4wLjAuMTo1MDAwLyIsImF1ZCI6Imh0dHA6Ly8xMjcuMC4wLjE6NTAwMC9yZXNvdXJjZXMiLCJjbGllbnRfaWQiOiJpb3Qub3Blbi5hcGkuQTdDQUUyNUQzNTkxNjc4RCIsInNjb3BlIjpbImFwaSIsInNtYXJ0aG9tZSJdLCJzdWIiOiIyMDE5IiwiYXV0aF90aW1lIjoiMTc0Mzg0NTQ0MyIsImlkcCI6ImxvY2FsIiwiYW1yIjoicHdkIiwiSnd0SWQiOiIwMDAwMDdlMy02N2YwZjg0My0xOTNkN2U0Zjk0ZGIzMDdiIiwib3JnIjoiQTdDQUUyNUQzNTkxNjc4RCIsInBob25lIjoiMTUwMDQ2NzE5NzIiLCJjaGFubmVsIjoiQTdDQUUyNUQzNTkxNjc4RCJ9.V59F6q6MaTgJHkzzG_bQpXa5AwqwjZ1Z9SsaZJuH3NY'; // 如果有可用的token，可以填入这里

// 封装请求方法
const request = async (url, options = {}) => {
  try {
    // 设置请求头
    if (!options.header) {
      options.header = {};
    }
    
    let accessToken = '';
    
    // 首先尝试从临时硬编码token获取
    if (TEMP_ACCESS_TOKEN) {
      accessToken = TEMP_ACCESS_TOKEN;
    } else {
      // 如果没有临时token，尝试从本地存储获取
      try {
        accessToken = uni.getStorageSync('access_token');
      } catch (err) {
        console.log('本地存储获取access_token失败', err);
      }
      
      // 如果本地存储也没有，使用tokenUtil尝试获取
      if (!accessToken) {
        try {
          accessToken = await tokenUtil.getAccessToken();
        } catch (err) {
          console.error('获取access_token失败', err);
          // 不要抛出错误，允许继续执行，以便可以测试不需要认证的请求
        }
      }
    }
    
    // 添加access_token到请求头
    if (accessToken) {
      // 先去掉可能存在的Bearer前缀，然后统一添加
      const tokenWithoutPrefix = accessToken.startsWith('Bearer ') 
        ? accessToken.substring(7) 
        : accessToken;
      
      options.header['Authorization'] = `Bearer ${tokenWithoutPrefix}`;
    }
    
    // 设置内容类型
    if (!options.header['Content-Type'] && options.method !== 'GET') {
      options.header['Content-Type'] = 'application/json';
    }
    
    // 完整URL
    const fullUrl = THIRD_PARTY_BASE_URL + url;
    
    console.log('发送请求:', {
      url: fullUrl,
      method: options.method,
      data: options.data
    });
    
    // 发送请求
    return new Promise((resolve, reject) => {
      uni.request({
        url: fullUrl,
        ...options,
        success: (res) => {
          console.log('请求响应:', res);
          
          // 处理认证失败的情况
          if (res.statusCode === 401) {
            // 尝试刷新token
            tokenUtil.refreshAccessToken()
              .then(() => {
                // 重试请求
                request(url, options)
                  .then(resolve)
                  .catch(reject);
              })
              .catch((err) => {
                reject(err);
              });
          } else {
            resolve(res);
          }
        },
        fail: (err) => {
          console.error('请求失败:', err);
          reject(err);
        }
      });
    });
  } catch (error) {
    console.error('第三方API请求错误:', error);
    throw error;
  }
};

// 直接控制设备的方法，不需要授权token
// 应急使用，正式环境应该使用认证方式
const directControl = (deviceId, state) => {
  return new Promise((resolve, reject) => {
    // 完整URL
    const fullUrl = `${THIRD_PARTY_BASE_URL}/v4/devices/control/${deviceId}/turn`;
    
    uni.request({
      url: fullUrl,
      method: 'POST',
      data: { state },
      header: {
        'Content-Type': 'application/json'
      },
      success: (res) => {
        console.log('直接控制响应:', res);
        resolve(res);
      },
      fail: (err) => {
        console.error('直接控制失败:', err);
        reject(err);
      }
    });
  });
};

// 第三方API方法
export default {
  /**
   * 获取设备列表
   */
  getDevices() {
    return request('/Devices', {
      method: 'GET'
    });
  },
  
  /**
   * 控制设备
   * @param {String} deviceId 设备ID
   * @param {Number} state 控制状态，0关闭，1开启
   */
  controlDevice(deviceId, state) {
    // 尝试使用带认证的方式
    return request(`/v4/devices/control/${deviceId}/turn`, {
      method: 'POST',
      data: { state }
    }).catch(err => {
      console.log('带认证的控制失败，尝试直接控制', err);
      // 如果带认证的方式失败，尝试直接控制
      return directControl(deviceId, state);
    });
  },
  
  /**
   * 获取设备历史数据
   * @param {String} deviceId 设备ID
   * @param {Object} params 查询参数
   */
  getDeviceHistory(deviceId, params = {}) {
    return request(`/Devices/${deviceId}/History`, {
      method: 'GET',
      data: params
    });
  }
}; 